package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.Empleado;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;

public class EmpleadoDAO {

    private static Connection con;
    public static List<Empleado> resultados;

    public static void crear(Empleado empleado) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException("Ha ocurrido un error al intentar conectarse con la base de datos");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into Empleado values(?,?,?,?,?,?,?,?)");
            pst.setString(1, null);
            pst.setString(2, empleado.getNombre());
            pst.setString(3, empleado.getUser());
            pst.setString(4, empleado.getCedula());
            pst.setString(5, empleado.getTelefono());
            pst.setString(6, empleado.getCargo());
            pst.setString(7, empleado.getEstado() + "");
            if (empleado.getRol() != null) {
                pst.setInt(8, empleado.getRol().getId());
            } else {
                pst.setInt(8, 0);
            }
            pst.executeUpdate();


        } finally {

            if (pst != null) {
                pst.close();
            }
        }
    }

    public static Empleado consultar(String cedula) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        Empleado empleado = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("SELECT Empleado.*, Rol.nombre FROM Empleado LEFT JOIN Rol ON  Empleado.idRol = Rol.id  where Empleado.cedula = ?");
            pst.setString(1, cedula);
            rs = pst.executeQuery();

            while (rs.next()) {
                empleado = Empleado.cargarDatos(rs);

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return empleado;
        }
    }

    public static List listar(String cedula) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("SELECT Empleado.*, Rol.nombre FROM Empleado LEFT JOIN Rol ON Empleado.cedula like ? and Empleado.idRol = Rol.id");
            pst.setString(1, "%" + cedula + "%");
            rs = pst.executeQuery();
            while (rs.next()) {
                if (resultados == null) {
                    resultados = new LinkedList<Empleado>();
                }
                resultados.add(Empleado.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static Empleado iniciar(String nombreUsuario, String cedula, String Rol) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        Empleado empleado = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("SELECT Empleado.*, Rol.nombre FROM Empleado LEFT JOIN Rol ON  Empleado.idRol = Rol.id  where Empleado.user = ? and Empleado.cedula = ? and Empleado.estado='a' and idRol <> 0");
            pst.setString(1, nombreUsuario);
            pst.setString(2, cedula);
            rs = pst.executeQuery();

            while (rs.next()) {
                empleado = Empleado.cargarDatos(rs);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return empleado;
        }
    }

    public static void actualizar(Empleado empleado) throws SQLException, Exception {
        int id = consultar(empleado.getCedula()).getId();

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update Empleado Set nombre=?,telefono=?,cedula=?,estado=?,cargo=?,estado=?,idRol=? Where id=?");
            pst.setString(1, empleado.getNombre());
            pst.setString(2, empleado.getTelefono());
            pst.setString(3, empleado.getCedula());
            pst.setString(4, empleado.getEstado() + "");
            pst.setString(5, empleado.getCargo());
            pst.setString(6, empleado.getEstado() + "");
            if (empleado.getRol() != null) {
                pst.setInt(7, empleado.getRol().getId());
            } else {
                pst.setInt(7, 0);
            }
            pst.setInt(8, id);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static void eliminar(String cedula) throws SQLException, Exception {
        if (consultar(cedula) == null) {
            throw new SQLException("");
        }
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("delete from Empleado where cedula = ?");
            pst.setString(1, cedula.trim());
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }
}
